A Managed C++ programozási nyelv

Kivételkezelés

Kivételkezelés

A kivételek dobására és kezelésére használt kulcsszavak megegyeznek a hagyományos C++-beli megfelelőikkel, de itt is vannak eltérések.

Felügyelt osztályok esetén a kivételek mind a System::Exception ősosztályból származnak. Bevezették a nyelvbe a __finally blokkot, amelyet a catch blokk után kell írni, és a benne található utasítások minden esetben végrehajtódnak, függetlenül attól, hogy történt-e kivétel vagy nem. Erre az erőforrások megfelelő felszabadítása miatt van szükség. (C++-ban nincs finally ág, a problmát úgy szokták megoldani, hogy az erőforrásokat olyan osztályba ágyazzák be, amelynek a destruktora felszabadítja őket. Akár hagyományos módon, akár kivétel dobása révén ér véget egy alprogram, a destruktor végrehajtódik, ezért nem kell a finally ág. Ezt a megoldást nevezik RAII-nek.)

Példa:

__gc class MyException : public System::Exception { }; void f() { throw new MyException; } int main() { try { f(); } catch (MyException *e) { System::Console::WriteLine("in catch"); System::Console::WriteLine(e->GetType()); } __finally { System::Console::WriteLine("in finally"); } }

A futtatás eredménye:

in catch MyException in finally